home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / MISC / MAG10.ZIP / 3D3.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-08-25  |  6.5 KB  |  175 lines

  1.                Program WireFrame;
  2.  
  3.                Uses Mode13h,Crt;
  4.  
  5.                Const MaxPoints=30;
  6.                      MaxLines=30;
  7.  
  8.                Type Point3d=Record
  9.                                   X,Y,Z:Real;
  10.                             End;
  11.  
  12.                     Object3d=Record
  13.                                    NumberPoints:Byte;
  14.                                    NumberLines:Byte;
  15.                                    Pt:Array[1..MaxPoints] Of Point3d;
  16.                                    Lines:Array[1..MaxLines,1..2] Of Byte;
  17.                              End;
  18.  
  19.                Var A:Integer;
  20.                    Cube1,Cube2:Object3d;
  21.                    D:Char;
  22.  
  23.                Procedure Conv3d(X,Y,Z:Real;Var Xt,Yt:Integer);
  24.                Begin
  25.                     Xt:=160+Trunc((X*256)/Z);
  26.                     Yt:=100+Trunc((Y*256)/Z);
  27.                End;
  28.  
  29.                Procedure Load3d(Filename:String;Var Obj:Object3d);
  30.                Var F:Text;
  31.                    A:Byte;
  32.                Begin
  33.                     Assign(F,Filename);
  34.                     Reset(F);
  35.                     ReadLn(F,Obj.NumberPoints);
  36.                     ReadLn(F,Obj.NumberLines);
  37.                     For A:=1 To Obj.NumberPoints Do
  38.                       ReadLn(F,Obj.Pt[A].X,Obj.Pt[A].Y,Obj.Pt[A].Z);
  39.                     For A:=1 To Obj.NumberLines Do
  40.                       ReadLn(F,Obj.Lines[A,1],Obj.Lines[A,2]);
  41.                     Close(F);
  42.                End;
  43.  
  44.                Procedure Draw3d(Obj:Object3d;XOff,YOff,ZOff:Integer;
  45.                                 Color:Byte;Where:Word);
  46.                Var A:Byte;
  47.                    Pt1,Pt2:Byte;
  48.                    X1,Y1,X2,Y2:Integer;
  49.                Begin
  50.                     For A:=1 To Obj.NumberLines Do
  51.                     Begin
  52.                          Pt1:=Obj.Lines[A,1];
  53.                          Pt2:=Obj.Lines[A,2];
  54.                          Conv3d(Obj.Pt[Pt1].X+XOff,
  55.                                 Obj.Pt[Pt1].Y+YOff,
  56.                                 Obj.Pt[Pt1].Z+ZOff,
  57.                                 X1,Y1);
  58.                          Conv3d(Obj.Pt[Pt2].X+XOff,
  59.                                 Obj.Pt[Pt2].Y+YOff,
  60.                                 Obj.Pt[Pt2].Z+ZOff,
  61.                                 X2,Y2);
  62.                          LineC(X1,Y1,X2,Y2,Color,Where);
  63.                     End;
  64.                End;
  65.  
  66.                Procedure Translate(Var Obj:Object3d;XOff,YOff,ZOff:Integer);
  67.                Var A:Byte;
  68.                Begin
  69.                     For A:=1 To Obj.NumberPoints Do
  70.                     Begin
  71.                          Obj.Pt[A].X:=Obj.Pt[A].X+XOff;
  72.                          Obj.Pt[A].Y:=Obj.Pt[A].Y+YOff;
  73.                          Obj.Pt[A].Z:=Obj.Pt[A].Z+ZOff;
  74.                     End;
  75.                End;
  76.  
  77.                Procedure Scale(Var Obj:Object3d;XScl,YScl,ZScl:Real);
  78.                Var A:Byte;
  79.                Begin
  80.                     For A:=1 To Obj.NumberPoints Do
  81.                     Begin
  82.                          Obj.Pt[A].X:=Obj.Pt[A].X*XScl;
  83.                          Obj.Pt[A].Y:=Obj.Pt[A].Y*YScl;
  84.                          Obj.Pt[A].Z:=Obj.Pt[A].Z*ZScl;
  85.                     End;
  86.                End;
  87.  
  88.                Procedure RotateX(Var Obj:Object3d;Deg:Integer);
  89.                Var A:Byte;
  90.                    Angle:Real;
  91.                    ZTemp:Real;
  92.                    S,C:Real;
  93.                Begin
  94.                     Angle:=0.0175*Deg;
  95.                     S:=Sin(Angle);
  96.                     C:=Cos(Angle);
  97.                     For A:=1 To Obj.NumberPoints Do
  98.                       With Obj.Pt[A] Do
  99.                       Begin
  100.                            ZTemp:=Z;
  101.                            Z:=ZTemp*C-Y*S;
  102.                            Y:=Y*C+ZTemp*S;
  103.                       End;
  104.                End;
  105.  
  106.                Procedure RotateY(Var Obj:Object3d;Deg:Integer);
  107.                Var A:Byte;
  108.                    Angle:Real;
  109.                    XTemp:Real;
  110.                    S,C:Real;
  111.                Begin
  112.                     Angle:=0.0175*Deg;
  113.                     S:=Sin(Angle);
  114.                     C:=Cos(Angle);
  115.                     For A:=1 To Obj.NumberPoints Do
  116.                       With Obj.Pt[A] Do
  117.                       Begin
  118.                            XTemp:=X;
  119.                            X:=XTemp*C-Z*S;
  120.                            Z:=Z*C+XTemp*S;
  121.                       End;
  122.                End;
  123.  
  124.                Procedure RotateZ(Var Obj:Object3d;Deg:Integer);
  125.                Var A:Byte;
  126.                    Angle:Real;
  127.                    XTemp:Real;
  128.                    S,C:Real;
  129.                Begin
  130.                     Angle:=0.0175*Deg;
  131.                     S:=Sin(Angle);
  132.                     C:=Cos(Angle);
  133.                     For A:=1 To Obj.NumberPoints Do
  134.                       With Obj.Pt[A] Do
  135.                       Begin
  136.                            XTemp:=X;
  137.                            X:=XTemp*C-Y*S;
  138.                            Y:=Y*C+XTemp*S;
  139.                       End;
  140.                End;
  141.  
  142.                Procedure Rotate(Var Obj:Object3d;XRot,YRot,ZRot:Integer);
  143.                Begin
  144.                     RotateX(Obj,XRot);
  145.                     RotateY(Obj,XRot);
  146.                     RotateZ(Obj,XRot);
  147.                End;
  148.  
  149.                Begin
  150.                     InitGraph;
  151.                     InitTables;  { In case you don't remember, this is in
  152.                                    the Mode13h unit... See issue 4 of 'The
  153.                                    Mag' for article on pregen arrays...    }
  154.                     Load3d('Cube.3d',Cube1);
  155.                     Load3d('Cube.3d',Cube2);
  156.                     SetColor(1,63,63,0);
  157.                     SetColor(2,63,0,0);
  158.                     Translate(Cube1,-40,-20,200);
  159.                     Translate(Cube2,40,-20,200);
  160.                     A:=1;
  161.                     Repeat
  162.                          Translate(Cube1,40,20,-200);
  163.                          Translate(Cube2,-40,20,-200);
  164.                          Rotate(Cube1,5,5,5);
  165.                          Rotate(Cube2,5,5,5);
  166.                          Translate(Cube1,-40,-20,200);
  167.                          Translate(Cube2,40,-20,200);
  168.                          Draw3d(Cube1,0,0,0,1,VGA);
  169.                          Draw3d(Cube2,0,0,0,2,VGA);
  170.                          Draw3d(Cube1,0,0,0,0,VGA);
  171.                          Draw3d(Cube2,0,0,0,0,VGA);
  172.                          Inc(A);
  173.                     Until (A>72) Or Keypressed;
  174.                     Closegraph;
  175.                End.